# 获取当前目录下所有.cpp文件
SRCS := $(wildcard *.cpp)

# 将.cpp文件列表转换为对应的.out文件列表
TARGETS := $(SRCS:.cpp=.out)

# 编译器和链接器选项，添加-lpthread支持多线程
CXX := g++
LDFLAGS := -lpthread

# 默认目标：编译所有文件
all: $(TARGETS)

# 模式规则：编译单个.cpp文件为.out文件（出错时继续）
%.out: %.cpp
	@echo "Compiling $<..."
	$(CXX) $< -o $@ $(LDFLAGS) -g -lpthread -std=c++20 || true  # 编译失败不中断

# 全量清理：删除所有生成的.out文件
clean:
	rm -f $(TARGETS)
	@echo "Cleaned all .out files"

# 安全清理：只删除对应.cpp文件有改动的.out文件（修复foreach语法）
safe_clean:
	@echo "Checking for outdated .out files..."
	$(foreach target,$(TARGETS), \
		src_file="$(target:.out=.cpp)"; \
		target_file="$(target)"; \
		if [ -f "$$src_file" ] && [ -f "$$target_file" ]; then \
			if [ "$$src_file" -nt "$$target_file" ]; then \
				echo "Removing outdated: $$target_file (since $$src_file was modified)"; \
				rm -f "$$target_file"; \
			fi; \
		fi; \
	)
	@echo "Safe clean completed"

# 声明伪目标，避免当前目录存在同名文件时的冲突
.PHONY: all clean safe_clean